package com.example.flow

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import org.junit.Test


/**
 * 流完成：当流收集完成或者发生异常情况时
 * 流完成处理：
 * 1）通过命令式的finally块处理
 * 2) onCompletion声明式处理
 *
 * @author zhouronghua
 * @time 2022/1/7 10:28 下午
 */
class FlowCompleteTest {

    /**
     * 通过finally处理流完成操作
     *
     * @author zhouronghua
     * @time 2022/1/7 10:30 下午
     */
    @Test
    fun test_flow_complete_finally() = runBlocking {
        try {
            (1..10).asFlow()
                .filterNot {
                    it % 2 != 0
                }.collect {
                    println("收集元素 $it")
//                    check(it > 5)
                }
        } catch (e: Throwable) {
            println("Caught Exception: $e")
        } finally {
            println("流已经结束")
        }
    }


    /**
     * 通过finally处理流完成操作
     * 说明：onCompletion需要在collect之前
     *
     * @author zhouronghua
     * @time 2022/1/7 10:30 下午
     */
    @Test
    fun test_flow_complete_onCompletion() = runBlocking {
        try {
            (1..10).asFlow()
                .filterNot {
                    it % 2 != 0
                }.onCompletion {
                    println("流收集完成！！")
//                    check(it > 5)
                }.collect {
                    println("收集元素 $it")
                }
        } catch (e: Throwable) {
            println("Caught Exception: $e")
        } finally {
            println("流已经结束")
        }
    }
}